package gutenberg.pygments; import org.junit.Test; import org.python.core.PyObject; import org.python.core.PyString; import org.python.util.PythonInterpreter; import static org.assertj.core.api.Assertions.assertThat; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class PygmentsTest { @Test public void tokenize_known_language() { Pygments pygments = new Pygments(); Tokens tokens = pygments.tokenize("clojure", "" + "(defn year-end-evaluation\n" + " []\n" + " (if (> (rand) 0.5)\n" + " \"You get a raise!\"\n" + " \"Better luck next year!\"))"); assertThat(tokens).isNotNull(); assertThat(tokens).contains(new TokenWithValue(Token.String, "\"You get a raise!\"")); } @Test public void raw_usecase() { PythonInterpreter interpreter = new PyGateway().getInterpreter(); // Set a variable with the content you want to work with interpreter.set("code", "" + "(defn year-end-evaluation\n" + " []\n" + " (if (> (rand) 0.5)\n" + " \"You get a raise!\"\n" + " \"Better luck next year!\"))"); // Simple use Pygments as you would in Python interpreter.exec("from pygments import highlight\n" + "from pygments.lexers.jvm import ClojureLexer\n" + "from pygments.formatters import RawTokenFormatter\n" + "\n" + "result = highlight(code, ClojureLexer(), RawTokenFormatter())"); // Get the result that has been set in a variable PyObject result = interpreter.get("result"); PyString string = (PyString) result; assertThat(string.getString()).isEqualTo("" + "Token.Punctuation\tu'('\n" + "Token.Keyword.Declaration\tu'defn '\n" + "Token.Name.Variable\tu'year-end-evaluation'\n" + "Token.Text\tu'\\n '\n" + "Token.Punctuation\tu'['\n" + "Token.Punctuation\tu']'\n" + "Token.Text\tu'\\n '\n" + "Token.Punctuation\tu'('\n" + "Token.Keyword\tu'if '\n" + "Token.Punctuation\tu'('\n" + "Token.Name.Builtin\tu'> '\n" + "Token.Punctuation\tu'('\n" + "Token.Name.Function\tu'rand'\n" + "Token.Punctuation\tu')'\n" + "Token.Text\tu' '\n" + "Token.Literal.Number.Float\tu'0.5'\n" + "Token.Punctuation\tu')'\n" + "Token.Text\tu'\\n '\n" + "Token.Literal.String\tu'\"You get a raise!\"'\n" + "Token.Text\tu'\\n '\n" + "Token.Literal.String\tu'\"Better luck next year!\"'\n" + "Token.Punctuation\tu')'\n" + "Token.Punctuation\tu')'\n" + "Token.Text\tu'\\n'\n"); } @Test public void raw_customFormatter() { PythonInterpreter interpreter = new PyGateway().getInterpreter(); // Set a variable with the content you want to work with interpreter.set("code", "" + "(defn year-end-evaluation\n" + " []\n" + " (if (> (rand) 0.5)\n" + " \"You get a raise!\"\n" + " \"Better luck next year!\"))"); RFormatter rFormatter = new RFormatter(); interpreter.set("out", rFormatter); // Simple use Pygments as you would in Python interpreter.exec("" + "from pygments import highlight\n" + "from pygments.lexers.jvm import ClojureLexer\n" + "from pygments.formatter import Formatter\n" + "\n" + "class ForwardFormatter(Formatter):\n" + " def format(self, tokensource, outfile):\n" + " for ttype, value in tokensource:\n" + " out.write(ttype, value)\n" + "\n" + "highlight(code, ClojureLexer(), ForwardFormatter())"); assertThat(rFormatter.out.toString()).isEqualTo("" + "Token.Punctuation:[(']\n" + "Token.Keyword.Declaration:[defn ']\n" + "Token.Name.Variable:[year-end-evaluation']\n" + "Token.Text:[\\n ']\n" + "Token.Punctuation:[[']\n" + "Token.Punctuation:[]']\n" + "Token.Text:[\\n ']\n" + "Token.Punctuation:[(']\n" + "Token.Keyword:[if ']\n" + "Token.Punctuation:[(']\n" + "Token.Name.Builtin:[> ']\n" + "Token.Punctuation:[(']\n" + "Token.Name.Function:[rand']\n" + "Token.Punctuation:[)']\n" + "Token.Text:[ ']\n" + "Token.Literal.Number.Float:[0.5']\n" + "Token.Punctuation:[)']\n" + "Token.Text:[\\n ']\n" + "Token.Literal.String:[\"You get a raise!\"']\n" + "Token.Text:[\\n ']\n" + "Token.Literal.String:[\"Better luck next year!\"']\n" + "Token.Punctuation:[)']\n" + "Token.Punctuation:[)']\n" + "Token.Text:[\\n']\n"); } public class RFormatter extends PyObject { public StringBuilder out = new StringBuilder(); public void write(PyObject ttype, PyString value) { out.append(ttype).append(":[").append(value.getString().replace("\n", "\\n")).append("']").append('\n'); } } }